from colorama import Fore, Back, Style
import numpy as np
import math as math
import pandas as pd
""" 
import sys

from scipy.stats import bartlett
from factor_analyzer.factor_analyzer import calculate_kmo,calculate_bartlett_sphericity

sys.path.append('D:/gitee/python-script-new/papertools/')
 """
# 导入 pappertool 包中的 common_functions 模块

from paper_tool.papertools import *

# 默认情况下，pd.read_excel 或者 /read_csv 不会将第一行作为数据读取，而是将其视为列名。
# 如果你的数据文件的第一行不是标题，那时你可以使用 header=None 参数来覆盖这个默认行为，然后会自动生成默认的整数列名。

# 读取 CSV 文件
# dataset = pd.read_csv('dest/servqual_data_v1.csv')

# dataset = pd.read_csv('dest/20231023-231319_truncatedNormalDistribution.csv')

# sheet_name = 'highlyCorrelatedReduced'
# file_path = 'dest/20231106-101631_truncatedNew.xlsx'

# sheetFilled
# file_path = 'dest/20231125-231918_truncatedNew.xlsx'
# file_path = 'dest/20231129-135223_truncatedNew.xlsx
file_path = 'dest/20231202-225633_truncatedNew.xlsx'
sheet_name = 'sheet3Filled'

def main_examine(file_path,sheet_name):
  
  dataset = pd.read_excel(file_path, sheet_name=sheet_name)

  # 使用isnull().sum()检查每列是否有缺失值, 如果某一列有缺失值，它会显示一个大于零的数字。如果所有列都没有缺失值，这些数字都将为零。
  """ missing_values = dataset.isnull().sum()
  print('缺失值: ',missing_values) """

  # 使用var()方法检查每列的方差
  variance_per_column = dataset.var()
  print('每列的方差: ',variance_per_column)


  # 信度检验, 一般地,问卷的α 系数在0.8以上该问卷才具有使用价值, 越接近1，就说明可靠性就越高
  # 已在spss软件中验证, 结果一致
  reliabilityResult = cronbachAlpha.reliabilityAnalysis(dataset)

  # 效度检验, 通过的标准是 KMO值应大于 0.7 , Bartlett球形检验值 显著 即sig.小于0.05
  # spss软件中提示 此矩阵不是正定矩阵
  validityResult = validityAnalysis.validityAnalysisFun(dataset)


  print(Fore.BLUE + '信度')
  print('cronbachAlpha: ',reliabilityResult[0])

  print(Fore.YELLOW + '效度')
  print('bartlett_p_value:',validityResult['bartlett_p_value'])
  print('kmo: ',validityResult['Overall_KMO'])
  print(validityResult)

  reliabilityPass = False
  validityPass = False

  if(reliabilityResult[0] > 0.8):
    reliabilityPass = True

  if(validityResult['bartlett_p_value'] < 0.05 and validityResult['Overall_KMO'] > 0.7):
    validityPass = True

  if(reliabilityPass):
    print(Fore.GREEN+'信度检验通过!')
  else:
    print(Fore.RED+ '信度检验不通过')

  if(validityPass):
    print(Fore.GREEN+'效度检验通过!')
  else:
    print(Fore.RED+ '效度检验不通过')

  print(Fore.RESET) 

if __name__ == "__main__":
    main_examine(file_path,sheet_name)